Technote 1071

Working with Multiprocessing Services


ñ⁄éü

Apple É}ÉãÉ`ÉvÉçÉZÉbÉVÉìÉO API DžǬǢǃ

É}ÉãÉ`ÉvÉçÉZÉbÉVÉìÉOÇÃégÇ¢ï˚

É}ÉãÉ`ÉvÉçÉZÉbÉVÉìÉOÇ≈ǂǡǃǢǢDZÇΔÇΔÅAǂǡǃÇÕÇ¢ÇØÇ»Ç¢Ç±ÇΔ

óvñÒ
DZÇà TECHNOTE Ç≈ÇÕÅAApple É}ÉãÉ`ÉvÉçÉZÉbÉVÉìÉO API ÇégópÇ∑ÇÈÇΩÇflÇ…ïKóvÇ»äÓñ{ìIéËèáDžǬǢǃê‡ñæÇµÅAǪÇà API ÇégǡǃçÏê¨Ç≥ÇÍÇÈÉ^ÉXÉNÇ≈Ç≈Ç´ÇÈDZÇΔÇΔÇ≈ǴǻǢDZÇΔÇñæÇÁǩDžǵÇÊǧÇΔévǢNjÇ∑ÅB

DZÇà TECHNOTE ÇÕÅAÉ}ÉãÉ`ÉvÉçÉZÉbÉVÉìÉO API Ç≈çÏãΔÇǵǃǢÇÈÉfÉxÉçÉbÉpÅAdžÇÈÇ¢ÇÕDZÇà API ÇégópÇ∑Ç◊Ç≠èÄîıÇêiÇflǃǢÇÈÉfÉxÉçÉbÉpÇÃéQçlÇ…Ç»ÇËÇ‹Ç∑ÅBDZDZDždžÇ∞ÇΩéñó·ÇÕéÂÇΔǵǃÉAÉvÉäÉPÅ[ÉVÉáÉìÇÃèëÇ´éËÇ…ñóßǬLJÇÃÇ≈Ç∑Ç™ÅAìØéûÇ…ÉVÉXÉeÉÄÉåÉxÉãÇÃÉGÉìÉWÉjÉADžLJóLópÇ»èÓïÒLJä‹Ç‹ÇÍǃǢNjÇ∑ÅB


Apple É}ÉãÉ`ÉvÉçÉZÉbÉVÉìÉO API DžǬǢǃ
Apple É}ÉãÉ`ÉvÉçÉZÉbÉVÉìÉO API ÇÕÅAÉAÉvÉäÉPÅ[ÉVÉáÉìÇ™É^ÉXÉNÇΔåƒÇŒÇÍÇÈé¿çsÇÃìΔóßǵÇΩÉXÉåÉbÉhÇçÏê¨Ç∑ÇÈDZÇΔÇâ¬î\Ç…Ç∑ÇÈåƒÇ—èoǵÇÃÉZÉbÉgÇíÒãüǵNjÇ∑ÅBÉ^ÉXÉNÇÕÅAÉVÉXÉeÉÄì‡Ç≈égópâ¬î\Ç»ÉvÉçÉZÉbÉTè„Ç≈ÉvÉäÉGÉìÉvÉeÉBÉuÇ…ÉXÉPÉWÉÖÅ[ÉãÇ≥ÇÍÇ‹Ç∑ÅBDZÇÍÇÕÅAégópâ¬î\Ç»ÉvÉçÉZÉbÉTÇ™àÍǬǵǩǻǢèÍçáLJìØólÇ≈Ç∑ÅBÉ^ÉXÉNÇÕÅAÉVÉXÉeÉÄÉÅÉÇÉäDžǬǢǃÉAÉvÉäÉPÅ[ÉVÉáÉìÇΔìØólÇÃÉrÉÖÅ[ÇéùÇøÇ‹Ç∑ÅB

ÉAÉvÉäÉPÅ[ÉVÉáÉìÇ≈ÇÕÅAÉAÉvÉäÉPÅ[ÉVÉáÉìÇ…ë„ÇÌǡǃèàóùÇé¿çsÇ∑ÇÈÇΩÇflÇ…égópÇ∑ÇÈÉ^ÉXÉNÇçÏê¨ÇµÇ‹Ç∑ÅBÉ}ÉãÉ`ÉvÉçÉZÉbÉTÉVÉXÉeÉÄÇ≈ÇÕÅAÉ^ÉXÉNÇ…ÇÊǡǃèàóùÇÕìØéûÇ…é¿çsÇ≥ÇÍÇÈÇΩÇflÅAÉAÉvÉäÉPÅ[ÉVÉáÉìÇÃèàóùÇÃÉXÉãÅ[ÉvÉbÉgÇÕîÚñÙìIÇ…å¸è„ǵNjÇ∑ÅB

ÇΩÇΔǶnjÅAÉCÉÅÅ[ÉWèàóùÉAÉvÉäÉPÅ[ÉVÉáÉìÇÕÅAÉCÉÅÅ[ÉWÉfÅ[É^ÇÃîCà”ÇÃÉuÉçÉbÉNÇïœå`Ç∑ÇÈÉ^ÉXÉNÇçÏê¨Ç∑ÇÈDZÇΔÇ™Ç≈Ç´Ç‹Ç∑ÅBÉÜÅ[ÉUÇ™ÉCÉÅÅ[ÉWÇÃïœå`ÇëIëÇ∑ÇÈÇΔÇ´ÅAÉAÉvÉäÉPÅ[ÉVÉáÉìÇÕÉfÅ[É^Çï°êîÇÃè¨Ç≥Ç»ïîï™Ç…ï™äÑǵÅAǪÇÍǺÇÍÇÃÉ^ÉXÉNÇ™àÍǬÇÃïîï™Çïœå`Ç∑ÇÈÇÊǧDžóvãÅǵNjÇ∑ÅBDZÇÃÉvÉçÉZÉXÇÕÅAÇ∑Ç◊ǃÇÃïîï™Ç™ïœå`Ç≥ÇÍÇÈÇ‹Ç≈åJÇËï‘Ç≥ÇÍÇ‹Ç∑ÅBǪÇÍǺÇÍÇÃïîï™ÇÕìØéûÇ…èàóùÇ≥ÇÍÇÈÇΩÇflÅAÉCÉÅÅ[ÉWëSëÃÇïœçXÇ∑ÇÈÇÃÇ…óvÇ∑ÇÈéûä‘ÇÕîÒèÌÇ…íZèkÇ≥ÇÍÇ‹Ç∑ÅB

ï ÇÃó·ÇΔǵǃÇÕäJî≠ä¬ã´Ç™Ç†ÇËÇ‹Ç∑ÅBäJî≠ä¬ã´Ç≈ÇÕÅAÉ^ÉXÉNÇégǡǃÅAàŸÇ»ÇÈï°êîÇÃÉtÉ@ÉCÉãÇÉRÉìÉpÉCÉãÇ∑ÇÈDZÇΔÇ™Ç≈Ç´Ç‹Ç∑ÅBDZÇÃï˚ñ@ÇégǧÇΔÅAï°êîÇÃÉtÉ@ÉCÉãÇìØéûÇ…ÉRÉìÉpÉCÉãÇ≈Ç´ÇÈÇΩÇflÅAÉvÉçÉWÉFÉNÉgÇÃÉrÉãÉhÇ…óvÇ∑ÇÈéûä‘ÇÕëÂïùÇ…íZèkÇ≥ÇÍÇ‹Ç∑ÅB


É}ÉãÉ`ÉvÉçÉZÉbÉVÉìÉOÇÃégÇ¢ï˚

ÉâÉCÉuÉâÉäÇÃégÇ¢ï˚
É}ÉãÉ`ÉvÉçÉZÉbÉVÉìÉOÇégópÇ∑ÇÈÇ…ÇÕÅAÉ}ÉãÉ`ÉvÉçÉZÉbÉVÉìÉO API ÉâÉCÉuÉâÉäÇÉvÉçÉWÉFÉNÉgÇ…í«â¡ÇµÇƒÅAé„Ç¢ÉäÉìÉNÇê›íËǵNjÇ∑ÅBMetrowerks Ç≈ÉâÉCÉuÉâÉäÇΔé„Ç¢ÉäÉìÉNÇê›íËÇ∑ÇÈÇ…ÇÕÅAÉvÉçÉWÉFÉNÉgÉEÉBÉìÉhÉEÇÃÉâÉCÉuÉâÉäñºÇÃó◊DždžÇÈÉvÉãÉ_ÉEÉìÉÅÉjÉÖÅ[ÇégópǵÅAÅgweak linkÅhÇëIëǵNjÇ∑ÅBDZÇÃëÄçÏÇ…ÇÊÇËÅAÉâÉCÉuÉâÉäÇ™ë∂ç›ÇµÇ»Ç¢èÍçáÇ≈LJÅAÉAÉvÉäÉPÅ[ÉVÉáÉìÇÕãNìÆÇ≥ÇÍÇÈÇÊǧDžǻÇËÇ‹Ç∑ÅB

ÉAÉvÉäÉPÅ[ÉVÉáÉìÇÃêÊì™ãflÇ≠Ç≈ÅAÉ}ÉãÉ`ÉvÉçÉZÉbÉVÉìÉO API ÉâÉCÉuÉâÉäÇÃë∂ç›ÇÉeÉXÉgǵǃÇ≠ÇæÇ≥Ç¢ÅBDZÇÃèàóùÇçsǧÉtÉ@ÉCÉãÇ…ÇÕÅAMP.h ÉtÉ@ÉCÉãÇÉCÉìÉNÉãÅ[ÉhǵNjÇ∑ÅBÉâÉCÉuÉâÉäÇÃë∂ç›ÇÉeÉXÉgÇ∑ÇÈÇ…ÇÕÅAMPLibraryIsLoaded ÇåƒÇ—èoǵNjÇ∑ÅBMPLibraryIsLoaded ÇÕÅAÉâÉCÉuÉâÉäÇÃÉGÉìÉgÉäÉ|ÉCÉìÉgÇÃÇ¢Ç∏ÇÍÇ©ÇÃë∂ç›ÇÉeÉXÉgÇ∑ÇÈÉ}ÉNÉçÇ≈Ç∑ÅBMPLibraryIsLoaded ÇÃñflÇËílÇ™ True ÇÃèÍçáÅAÉâÉCÉuÉâÉäÇÕë∂ç›ÇµÅAǪÇÃÉTÅ[ÉrÉXÇégópÇ∑ÇÈDZÇΔÇ™Ç≈Ç´Ç‹Ç∑ÅBñflÇËílÇ™ False ÇÃèÍçáÅAÉAÉvÉäÉPÅ[ÉVÉáÉìÇ≈ÇÕÉ}ÉãÉ`ÉvÉçÉZÉbÉVÉìÉOÉTÅ[ÉrÉXÇåƒÇ—èoÇ∑DZÇΔÇ»Ç≠é¿çsÇ≥ÇÍÇÈDZÇΔÇ…Ç»ÇËÇ‹Ç∑ÅB

çÏê¨Ç∑ÇÈÉ^ÉXÉNêîÇÃåàíË
ÉVÉXÉeÉÄì‡ÇÃÉvÉçÉZÉbÉTêîÇÉJÉEÉìÉgÇ∑ÇÈÇ…ÇÕ MPProcessors ÇégópǵNjÇ∑ÅBÉvÉçÉZÉbÉTÇ™àÍǬǵǩǻǢèÍçáÇÕÅAÉ}ÉãÉ`ÉvÉçÉZÉbÉVÉìÉOÉTÅ[ÉrÉXÇ™égópâ¬î\Ç≈ǻǢǩÇÃÇÊǧDžèàóùÇë±çsǵNjÇ∑ÅBÇΩÇæÇµÅAïKóvÇ»èÍçáÇÕÅAÉVÉìÉOÉãÉvÉçÉZÉbÉTä¬ã´Ç≈LJÉvÉäÉGÉìÉvÉeÉBÉuÇ»É^ÉXÉNÇçÏê¨Ç∑ÇÈDZÇΔÇ™Ç≈Ç´Ç‹Ç∑ÅB

MPProcessors Ç©ÇÁï‘Ç≥ÇÍÇΩÉJÉEÉìÉgÇÕÅAí èÌÅAçÏê¨Ç∑ÇÈÉ^ÉXÉNêîÇÃéwïWÇΔǵǃégópǵNjÇ∑ÅBçÏê¨Ç∑ÇÈÉ^ÉXÉNêîÇåàíËÇ∑ÇÈÇ…ÇÕÇ¢Ç≠ǬǩÇÃóvàˆÇ™ë∂ç›ÇµÇ‹Ç∑ÅB

Ç‹Ç∏ëÊàÍÇÃóvàˆÇÕÅAÉAÉvÉäÉPÅ[ÉVÉáÉìÇ™Ç∑Ç◊ǃÇÃÉvÉçÉZÉbÉTÇÉrÉWÅ[Ç»èÛë‘Džǵë±ÇØÇÊǧÇΔÇ∑ÇÈǩǫǧǩÇ≈Ç∑ÅBDZÇÍÇçsǧÇΩÇflÇÃç≈LJä»íPÇ»ï˚ñ@ÇÕÅAè≠Ç»Ç≠ÇΔLJÉvÉçÉZÉbÉTÇΔìØêîÇÃÉ^ÉXÉNÇçÏê¨Ç∑ÇÈDZÇΔÇ≈Ç∑ÅBDZǧÇ∑ÇÍÇŒÅAÉAÉvÉäÉPÅ[ÉVÉáÉìÇÕèàóùÇǪÇÃêîÇÃïîï™Ç…ï™äÑǵÅAǪÇÍǺÇÍÇÃÉ^ÉXÉNÇ™àÍǬÇÃïîï™ÇèàóùÇ∑ÇÈDZÇΔÇóvãÅǵNjÇ∑ÅBÉAÉvÉäÉPÅ[ÉVÉáÉìÇ≈ÇÕÅAèàóùÇë±çsÇ∑ÇÈëOÇ…ÅAÉ^ÉXÉNÇ™èIóπÇ∑ÇÈÇÃÇë“ÇøÇ‹Ç∑ÅBÉ^ÉXÉNÇ™Ç∑Ç◊ǃÇÃïîï™ÇèIóπÇ∑ÇÈÇΩÇflÇ… 1/10 ïbà»è„ÇóvÇ∑ÇÈèÍçáÅAÉAÉvÉäÉPÅ[ÉVÉáÉìÇ≈ÇÕÅAÉ^ÉXÉNÇÃäÆóπÇë“ǬàÍï˚Ç≈ÅAÉCÉxÉìÉgÇÃÉ`ÉFÉbÉNÇçsǡǃÇ≠ÇæÇ≥Ç¢ÅB

è„ÇÃï˚ñ@ÇÃë„ópÇΔǵǃïpî…Ç…çÃópÇ≥ÇÍÇÈÉeÉNÉjÉbÉNÇÕÅAë∂ç›Ç∑ÇÈÉvÉçÉZÉbÉTÇÃêîÇÊÇËLJàÍǬè≠ǻǢÉ^ÉXÉNÇçÏê¨Ç∑ÇÈÇΔǢǧï˚ñ@Ç≈Ç∑ÅBDZÇÃèÍçáÅAÉAÉvÉäÉPÅ[ÉVÉáÉìÇÕèàóùÇÉvÉçÉZÉbÉTÇΔìØêîÇÃïîï™Ç…ï™äÑǵNjÇ∑ÅBǪÇÍǺÇÍÇÃÉ^ÉXÉNÇÕàÍǬÇÃïîï™ÇèàóùÇ∑ÇÈÇÊǧDžóvãÅÇ≥ÇÍÅAécÇ≥ÇÍÇΩïîï™ÇÕÉÅÉCÉìÉAÉvÉäÉPÅ[ÉVÉáÉìÇ™íºê⁄èàóùǵNjÇ∑ÅBèàóùÇ™èIóπÇ∑ÇÈÇΔÅAÉAÉvÉäÉPÅ[ÉVÉáÉìÇÕÉ^ÉXÉNÇ™èIóπÇ∑ÇÈÇÃÇë“ÇøÇ‹Ç∑ÅBèàóùÇ™ìKêÿÇ…ìôï™Ç…ï™äÑÇ≥ÇÍǃǢÇÈèÍçáÅAÉAÉvÉäÉPÅ[ÉVÉáÉìÇ™ë“ã@ÇäJénÇ∑ÇÈéûì_Ç≈ÅAÉ^ÉXÉNÇÕèIóπǵǃǢÇÈÇ©ÅAÇŸÇ⁄èIóπǵÇÊǧÇΔǵǃǢÇÈÇÕÇ∏Ç≈Ç∑ÅBDZÇÃÉAÉvÉçÅ[É`ÇÕÅAÉVÉìÉOÉãÉvÉçÉZÉbÉTä¬ã´Ç…óeà’Ç…àÍî âªÇ≈Ç´ÇÈÇΩÇflîÒèÌÇ…êlãCǙdžÇËÇ‹Ç∑ÅBǬNjÇËÅAçÏê¨Ç≥ÇÍÇÈÉ^ÉXÉNÇÃêîÇÉ[ÉçÇ…Ç∑ÇÈÇΔÅAìñëRÇÃDZÇΔǻǙÇÁÉAÉvÉäÉPÅ[ÉVÉáÉìÇ™ç≈èIìIÇ…Ç∑Ç◊ǃÇÃèàóùÇé¿çsÇ∑ÇÈDZÇΔÇ…Ç»ÇËÇ‹Ç∑ÅBÇ‹ÇΩÅADZÇÃÉAÉvÉçÅ[É`ÇÕÅAâΩÇÁÇ©ÇÃóùóRÇ≈É}ÉãÉ`ÉvÉçÉZÉbÉVÉìÉO API ÉâÉCÉuÉâÉäÇ™égópÇ≈ǴǻǢÇΔǴDžǵÇΩǙǧåoòHÇ≈LJdžÇËÇ‹Ç∑ÅBDZÇÃÇΔÇ´ÅAÉAÉvÉäÉPÅ[ÉVÉáÉìÇÕèàóùÇÃé¿çsDžǩǩÇÌÇÈÇΩÇflÅAèàóùÇÃé¿çsÇ…óvÇ∑ÇÈéûä‘Ç 1/10 ïbñ¢ñûÇ…êßå¿Ç∑ÇÈDZÇΔÇ™èdóvÇ…Ç»ÇËÇ‹Ç∑ÅBDZǧÇ∑ÇÍÇŒÅAÉCÉxÉìÉgÇÃÉ`ÉFÉbÉNÇè\ï™Ç»ïpìxÇ≈é¿çsÇ∑ÇÈDZÇΔÇ™Ç≈Ç´ÅAÉAÉvÉäÉPÅ[ÉVÉáÉìÇÕǪÇÃê”îCÇâ ÇΩÇ∑DZÇΔÇ™Ç≈Ç´Ç‹Ç∑ÅB

è„ÇÃÉPÅ[ÉXÇ≈ÇÕÅAÇ∑Ç◊ǃÇÃÉ^ÉXÉNǙǟÇ⁄ìØÇ∂èàóùÇé¿çsÇ∑ÇÈDZÇΔÇ™ëOíÒDžǻǡǃǢNjÇ∑ÅBÉAÉvÉäÉPÅ[ÉVÉáÉìǙNjǡÇΩÇ≠àŸÇ»ÇÈÉ^ÉCÉvÇÃèàóùÇé¿çsÇ∑ÇÈÉ^ÉXÉNÇçÏê¨Ç∑ÇÈèÍçáÅAçÏê¨Ç∑ÇÈÉ^ÉXÉNÇÃêîÇÕÅAé¿çsÇ∑ÇÈïKóvÇÃdžÇÈèàóùÇÃÉ^ÉCÉvÇ…ÇÊǡǃNjǡÇΩÇ≠àŸÇ»ÇËÇ‹Ç∑ÅBóØà”Ç∑Ç◊Ç´èdóvÇ»É|ÉCÉìÉgÇÕÅAÉvÉçÉZÉbÉTÇÇ≈Ç´ÇÈǩǨÇËÉrÉWÅ[Džǵë±ÇØÇÈDZÇΔÇ≈Ç∑ÅBDZÇÍÇçsǧDžÇÕÅAÉXÉãÅ[ÉvÉbÉgÇç≈ëÂâªÇµÇÊǧÇΔÇ∑ÇÈä‘ÇÕÅAè≠Ç»Ç≠ÇΔLJÉvÉçÉZÉbÉTÇΔìØêîÇÃÉ^ÉXÉNÇ™ä÷ó^Ç∑ÇÈÇÊǧDžǵNjÇ∑ÅB4 ÉvÉçÉZÉbÉTÉVÉXÉeÉÄLJàÍî âªÇµÇ¬Ç¬Ç†ÇËÇ‹Ç∑Ç™ÅAè´óàÇÕÇ≥ÇÁÇ…ã≠óÕÇ»ÉVÉXÉeÉÄÇÃìoèÍÇ™ó\ëzÇ≥ÇÍÇ‹Ç∑ÅB

É^ÉXÉNÇΔÇÃÉfÅ[É^ÇÃÇ‚ÇËéÊÇË
ÉAÉvÉäÉPÅ[ÉVÉáÉìÇΔÉ^ÉXÉNÇΔÇÃä‘ÇÃÉfÅ[É^ÇÃÇ‚ÇËéÊÇËÇÕÅAã§óLÉÅÉÇÉäÇ®ÇÊÇ—ìØä˙ÉÅÉ\ÉbÉhÇΔǢǧ 2 ǬÇÃäÓñ{ìIÇ»ï˚ñ@Ç≈é¿çsÇ≥ÇÍÇ‹Ç∑ÅBÇ∑Ç◊ǃÇÃÉÅÉÇÉäÇÕã§óLÇ≥ÇÍǃǢÇÈÇΩÇflÅAÉAÉvÉäÉPÅ[ÉVÉáÉìÇ™ÉÅÉÇÉäÇ…èëÇ´çûÇÒÇæÉfÅ[É^ÇÕÇ∑Ç◊ǃÉ^ÉXÉNÇ©ÇÁLJégópÇ≈Ç´Ç‹Ç∑ÅBÇ‡ÇøÇÎÇÒDZÇÃãtLJâ¬î\Ç≈Ç∑ÅBǵǩǵÅAÉAÉvÉäÉPÅ[ÉVÉáÉìÇ…ÇÊǡǃópà”Ç≥ÇÍÇΩÉÅÉÇÉäÇ…ÉAÉNÉZÉXÇ∑ÇÈëOÇ…ÅAÉ^ÉXÉNÇÕÅAÉ}ÉãÉ`ÉvÉçÉZÉbÉVÉìÉO API ÉâÉCÉuÉâÉäÇ≈égópâ¬î\Ç» 3 ǬÇÃÉÅÉ\ÉbÉhÇÃÇ¢Ç∏ÇÍÇ©ÇégǡǃÅAÉAÉvÉäÉPÅ[ÉVÉáÉìÇΔìØä˙Ç∑ÇÈïKóvǙdžÇËÇ‹Ç∑ÅBDZÇÃDZÇΔÇÕîÒèÌÇ…èdóvÇ≈Ç∑ÅBPowerPC ÉAÅ[ÉLÉeÉNÉ`ÉÉÇ≈ÇÕÅAÉÅÉÇÉäÇ÷ÇÃèëÇ´çûÇ›ÇíxâÑÇ∑ÇÈDZÇΔÇ™Ç≈Ç´Ç‹Ç∑ÅBDZÇÍÇÕÅAPowerPC ÇÃîÒèÌÇ…çÇë¨Ç»èàóùë¨ìxÇé¿åªÇ∑ÇÈÇΩÇflÇ…ñóßǬÉäÉ\Å[ÉXä«óùã@î\ÇÃàÍǬÇ≈Ç∑ÅBï ÇÃÉvÉçÉZÉbÉTÇ™ÉÅÉÇÉäì‡ÇÃê≥ǵǢílÇì«Ç›çûÇ›ÇΩÇflÇ…ÇÕÅAdžÇÈéÌÇÃÉnÅ[ÉhÉEÉFÉAÇ…àÀë∂ǵÇΩñΩóflÇé¿çsÇ∑ÇÈïKóvǙdžÇËÇ‹Ç∑ÅBÉ^ÉXÉNÇ™ìØä˙ÉÅÉ\ÉbÉhÇégópÇ∑ÇÈÇΔÇ´ÅADZÇÍÇÁÇÃñΩóflÇ™é¿çsÇ≥ÇÍÅAǪÇÍà»ç~ÅAèàóùÇ…ä÷ó^Ç∑ÇÈÉvÉçÉZÉbÉTÇÕämé¿Ç…àÍä—ǵÇΩÉÅÉÇÉäÇÃÉrÉÖÅ[ÇéùǬÇÊǧDžǻÇËÇ‹Ç∑ÅBâΩÇÁÇ©ÇÃóùóRÇ≈ÉRÉ~ÉÖÉjÉJÉìÉgÇÃÇ¢Ç∏ÇÍÇ©Ç≈ìØä˙Ç∑ÇÈÇΩÇflÇÃèÄîıÇ™Ç‹ÇæêÆÇ¡ÇƒÇ¢Ç»Ç¢ÇΔÇ´Ç…ÅAëºÇÃÉRÉ~ÉÖÉjÉJÉìÉgǙǪÇÍÇ…ëŒÇ∑ÇÈÉvÉçÉZÉbÉTÇ…èàóùÇè˜ìnÇ≈Ç´ÇÈÇÊǧDžÇ∑ÇÈÇΩÇflDžLJÅAìØä˙ÉÅÉ\ÉbÉhÇégópÇ∑ÇÈDZÇΔÇÕèdóvÇ≈Ç∑ÅBDZÇÍÇ…ÇÊÇËÅAÉvÉçÉZÉbÉTÇÕë¶ç¿Ç…ëºÇÃÉ^ÉXÉNÇ≈LJégópâ¬î\Ç…Ç»ÇËÅALJǡÇΔå¯ó¶ìIÇ…ÉvÉçÉZÉbÉTÇégópÇ∑ÇÈDZÇΔÇ™â¬î\Ç…Ç»ÇËÇ‹Ç∑ÅB

É}ÉãÉ`ÉvÉçÉZÉbÉVÉìÉO API ÉâÉCÉuÉâÉäÇ≈égópâ¬î\Ç»ìØä˙ÉÅÉ\ÉbÉhÇÕÅAQueueÅASemaphoreÅAÇ®ÇÊÇ— Critical Region Çà 3 ǬÇ≈Ç∑ÅB

Queue ÇÕÅA96 ÉrÉbÉgÇÃÉÅÉbÉZÅ[ÉWÇ©ÇÁÇ»ÇÈêÊì¸ÇÍêÊèoǵÇÃÉLÉÖÅ[Ç≈Ç∑ÅBóvëfÇÃë}ì¸ÇΔíäèoÇÕÉAÉgÉ~ÉbÉNÉIÉyÉåÅ[ÉVÉáÉìÇ≈džÇËÅAëΩêîÇÃÉ^ÉXÉNÇ™ó^ǶÇÁÇÍÇΩÉLÉÖÅ[Ç©ÇÁéüÇÃÉÅÉbÉZÅ[ÉWÇíäèoǵÇÊǧÇΔééÇ›ÇÈDZÇΔÇÕÇ≈Ç´Ç‹Ç∑Ç™ÅAê≥èÌÇ…éüÇÃÉÅÉbÉZÅ[ÉWÇéÊìæÇ≈Ç´ÇÈÇÃÇÕàÍǬÇÃÉ^ÉXÉNÇæÇØÇ≈Ç∑ÅB

Semaphore ÇÕÅAíPàÍÇà 32 ÉrÉbÉgílÇï\ǵÅADZÇÃílÇÕdžÇÁÇ©Ç∂ÇflíËã`Ç≥ÇÍǃǢÇÈç≈ëÂêîÇ‹Ç≈ÉAÉgÉ~ÉbÉNÇ…ÉCÉìÉNÉäÉÅÉìÉgÇ≥ÇÍÅAÇ‹ÇΩÇÕç≈è¨ílÇÃÉ[ÉçÇ‹Ç≈ÉAÉgÉ~ÉbÉNÇ…ÉfÉNÉäÉÅÉìÉgÇ≥ÇÍÇ‹Ç∑ÅB

Critical Region ÇÕÅAǪÇÍÇÁÇ™àÕÇÒÇ≈Ç¢ÇÈÉRÅ[ÉhÇÃÉZÉNÉVÉáÉìÇ™ï°êîÇÃÉ^ÉXÉNÇ‹ÇΩÇÕÉAÉvÉäÉPÅ[ÉVÉáÉìÇ…ÇÊǡǃìØéûÇ…é¿çsÇ≥ÇÍǻǢÇÊǧDžǵNjÇ∑ÅB

É^ÉXÉNÇçÏê¨Ç∑ÇÈëOÇ…ÅAí èÌÇÕÅAǪÇÍÇÁÇìØä˙Ç≥ÇπÇÈÇΩÇflÇÃï˚ñ@ÇçÏê¨Ç∑ÇÈDZÇΔÇÇ®ä©ÇflǵNjÇ∑ÅBQueue ÇΔ Semaphore ÇÕÅAç≈LJàÍî ìIÇ…égópÇ≥ÇÍÇÈ 2 ǬÇÃÉÅÉ\ÉbÉhÇ≈Ç∑ÅBÉ}ÉãÉ`ÉvÉçÉZÉbÉVÉìÉOÇ…ÇΔÇËǩǩÇÎǧÇΔÇ∑ÇÈêlÇÕÅAàÍî Ç… Queue ÇégópǵNjÇ∑ÅBDZÇÍÇÕÅAQueue Ç™îÒèÌÇ…è_ìÓÇ≈ÅAǩǬî‰ärìIóùâǵǂÇ∑Ç¢ÇΩÇflÇ≈Ç∑ÅBSemaphore ÇÕ Queue ÇΔî‰ärÇ∑ÇÈÇΔÅAÇÊÇËçÇë¨Ç≈ÉÅÉÇÉäÇ…ëŒÇ∑ÇÈïââ◊LJè¨Ç≥Ç¢Ç≈Ç∑Ç™ÅAìØíˆìxÇÃè_ìÓê´ÇíÒãüÇ∑ÇÈDZÇΔÇÕdžÇËÇ‹ÇπÇÒÅBQueue ÇΔ Semaphore ÇÕÅAí èÌÉyÉAÇ≈çÏê¨Ç≥ÇÍÇ‹Ç∑ÅBǬNjÇËÅAàÍï˚Ç™ÉäÉNÉGÉXÉgÇÃÉVÉOÉiÉãÇëóÇËÅALJǧàÍï˚Ç™åãâ ÇÃÉVÉOÉiÉãÇëóÇËÇ‹Ç∑ÅBèâêSé“Ç™îΔÇµÇ™ÇøÇ»åÎÇËÇÕ (DZÇÍÇÕíòé“ÇÃåoå±Ç©ÇÁåæÇ¶ÇÈDZÇΔÇ≈Ç∑Ç™)ÅAàÍï˚ÇÃìØä˙ÉIÉuÉWÉFÉNÉgÇæÇØÇçÏê¨ÇµÅAóºï˚ÇÃñ⁄ìIÇ≈ǪÇÍÇégópǵÇÊǧÇΔÇ∑ÇÈDZÇΔÇ≈Ç∑ÅBDZÇÍÇ≈ÇÕê≥èÌÇ…ìÆçÏǵNjÇπÇÒÅBÉäÉNÉGÉXÉgÇ™É|ÉXÉgÇ≥ÇÍÇΩå„ÅAÇ¢Ç∏ÇÍÇ©ÇÃéûì_Ç≈ÉAÉvÉäÉPÅ[ÉVÉáÉìÇÕåãâ Çë“ÇøénÇflÇ‹Ç∑ÅBÉäÉNÉGÉXÉgÇ™É|ÉXÉgÇ≥ÇÍÇΩÇÃÇΔìØÇ∂èÍèäÇ≈ÉAÉvÉäÉPÅ[ÉVÉáÉìÇ™ë“ã@ÇçsǧèÍçáÅAÉäÉNÉGÉXÉgǪÇÃLJÇÃÇ™åãâ ÇΔǵǃåªÇÍÇ‹Ç∑ÅBÉAÉvÉäÉPÅ[ÉVÉáÉìÇÕÅAǪÇÍÇ™åãâ Ç≈džÇÈÇΔǢǧåÎÇ¡ÇΩîFéØÇ©ÇÁÉäÉNÉGÉXÉgÇÉNÉäÉAǵǃǵNjǧÇΩÇflÅANjǡÇΩÇ≠âΩÇÃèàóùLJé¿çsÇ≥ÇÍÇ‹ÇπÇÒÅBDZÇÍÇ™ÅAëoï˚å¸ÇÃÉfÅ[É^ÇÃÇ‚ÇËéÊÇËÇçsǧÇΩÇflÇ… 2 ǬÇÃNjǡÇΩÇ≠àŸÇ»ÇÈÉGÉìÉeÉBÉeÉBÇégópÇ∑ÇÈDZÇΔÇ™èdóvÇ≈džÇÈÇΔǢǧDZÇΔÇÃóùóRÇ≈Ç∑ÅB

É^ÉXÉNÇÃçÏê¨
É^ÉXÉNÇÃçÏê¨ÇÕÅAMPCreateTask ÇåƒÇ—èoÇ∑DZÇΔÇ…ÇÊǡǃé¿çsǵNjÇ∑ÅBDZÇÃåƒÇ—èoǵDžëŒÇ∑ÇÈç≈èâÇÃÉpÉâÉÅÅ[É^ÇÕÅAé¿çsÉ^ÉXÉNÇΔÇ»ÇÈä÷êîÇ÷ÇÃÉ|ÉCÉìÉ^Ç≈Ç∑ÅBÉ^ÉXÉNÇÃä÷êîÇÕÅAéüÇÃÇÊǧǻÉvÉçÉgÉ^ÉCÉvÇéùǬïKóvǙdžÇËÇ‹Ç∑ÅB

OSStatus fTask( void *parameter );

É^ÉXÉNÇÕÅAǪÇÃÉXÉ^Å[ÉgÉAÉbÉvéûÇ… 32 ÉrÉbÉgÉpÉâÉÅÅ[É^ÇéÛÇØéÊÇËÅAǪÇÃèIóπéûÇ…ÇÕ 32 ÉrÉbÉgÇÃåãâ Çï‘ǵNjÇ∑ÅBÉXÉ^Å[ÉgÉAÉbÉvéûÇ…É^ÉXÉNÇ™éÛÇØéÊÇÈÉpÉâÉÅÅ[É^ÇÕÅAMPCreateTask åƒÇ—èoǵDžëŒÇ∑ÇÈëÊ 2 ÇÃÉpÉâÉÅÅ[É^ÇΔǵǃéwíËǵNjÇ∑ÅBDZÇÃÉpÉâÉÅÅ[É^ÇâÓǵǃÅAÉ^ÉXÉNÇ™ïKóvÇΔÇ∑ÇÈÇ∑Ç◊ǃÇÃèâä˙èÓïÒÇÃÇ‚ÇËéÊÇËÇ™çsÇÌÇÍÇ‹Ç∑ÅBDZÇÃíÜÇ…ÇÕÅAÉÅÉbÉZÅ[ÉWÉLÉÖÅ[Çà ID Ç‚ C++ ÉIÉuÉWÉFÉNÉgÇ÷ÇÃÉ|ÉCÉìÉ^ǻǫÅAdžÇÁljÇÈLJÇÃÇ™ä‹Ç‹ÇÍǃǢNjÇ∑ÅBDZÇÍÇ™ÅAÉAÉvÉäÉPÅ[ÉVÉáÉìÇ™É^ÉXÉNÇÃéıñΩëSëÃÇ…ÇÌÇΩǡǃÇ≥NjǥNjǻèÓïÒÇÇ‚ÇËéÊÇËÇ∑ÇÈÉ^ÉXÉNå≈óLÇÃÉÅÉÇÉäÉuÉçÉbÉNÇ÷ÇÃÉ|ÉCÉìÉ^Ç≈džÇÈDZÇΔLJãHÇ≈ÇÕdžÇËÇ‹ÇπÇÒÅB

MPLibraryIsLoaded ÇÃåƒÇ—èoǵǩÇÁ MPCreateTask ÇÃåƒÇ—èoǵNjÇ≈ÅADZDZNjÇ≈ÇÃÇ∑Ç◊ǃÇÃèàóùÇÕÅAÉAÉvÉäÉPÅ[ÉVÉáÉìÇÃÉXÉ^Å[ÉgÉAÉbÉvéûÇ…é¿çsÇ∑ÇÈDZÇΔÇ™Ç≈Ç´Ç‹Ç∑ÅBÉAÉvÉäÉPÅ[ÉVÉáÉìÇ™é¿çsÇ≥ÇÍǃǢÇÈä‘ÅAÉ^ÉXÉNÇé¿çsǵë±ÇØÇÈDZÇΔÇÕÅAïKóvÇ…âûÇ∂ǃÉ^ÉXÉNÇçÏê¨ÇµÇƒîjâÛÇ∑ÇÈDZÇΔÇ…î‰Ç◊ÇÈÇΔÇÕÇÈǩDžå¯ó¶ÇÃÇÊÇ¢êÌó™ÇΔǢǶNjÇ∑ÅBÉ^ÉCÉvÇÃàŸÇ»ÇÈèàóùÇé¿çsÇ∑ÇÈÇ≥NjǥNjǻÉ^ÉXÉNÇëΩêîçÏê¨Ç∑ÇÈïKóvǙdžÇÈèÍçáÇÕÅAÉZÉåÉNÉ^ÉxÅ[ÉXÇÃÉXÉLÅ[É}ÅAÇ‹ÇΩÇÕâ¬ïœä÷êîÉ|ÉCÉìÉ^ÇâÓǵǃÅAÉ^ÉCÉvÇÃàŸÇ»ÇÈëΩêîÇÃä÷êîÇåƒÇ—èoÇ∑DZÇΔÇÃÇ≈Ç´ÇÈÉ^ÉXÉNÇÃçÏê¨Çåüì¢ÇµÇƒÇ≠ÇæÇ≥Ç¢ÅB

éüÇÃÉRÅ[ÉhÇÕÅAÉAÉvÉäÉPÅ[ÉVÉáÉìǙǪÇÃãNìÆíºå„Ç…É}ÉãÉ`ÉvÉçÉZÉbÉVÉìÉOã@î\ÇämóßÇ∑ÇÈï˚ñ@ÇãÔëÃìIÇ…é¶ÇµÇƒÇ¢Ç‹Ç∑ÅBDZÇÃÉRÅ[ÉhÇ≈ÇÕÅAÉvÉçÉZÉbÉTêîÇÊÇËLJàÍǬè≠ǻǢÉ^ÉXÉNÇçÏê¨Ç∑ÇÈÉeÉNÉjÉbÉNÇégópǵǃǢNjÇ∑ÅB

typedef struct {
	long firstThing;
	long totalThings;
}sWorkParams, *sWorkParamsPtr;

typedef struct {
	MPTaskID taskID;
	MPQueueID requestQueue;
	MPQueueID resultQueue;
	sWorkParams params;
}sTaskData, *sTaskDataPtr;

long gNumProcessors;
sTaskDataPtr gTaskData;
MPQueueID gNotificationQueue;

void fStartMP( void ) {
	OSErr theErr;
	long i;

	theErr = noErr;
	/* ÉVÉìÉOÉãÉvÉçÉZÉbÉTÉÇÅ[ÉhÇëOíÒÇΔÇ∑ÇÈ */
	gNumProcessors = 1;

	/* écÇ≥ÇÍǃǢÇÈÉOÉçÅ[ÉoÉãÇèâä˙âªÇ∑ÇÈ */
	gTaskData = NULL;
	gNotificationQueue = NULL;

	/* ÉâÉCÉuÉâÉäÇ™ë∂ç›Ç∑ÇÈèÍçáÇÕÅAÉ^ÉXÉNÇçÏê¨Ç∑ÇÈ */
	/* (ÉVÉìÉOÉã CPU ÉVÉXÉeÉÄè„Ç…ÇÕÉ^ÉXÉNÇÕë∂ç›ÇµÇ»Ç¢) */
	if( MPLibraryIsLoaded() ) {
		gNumProcessors = MPProcessors();
		gTaskData = (sTaskDataPtr)NewPtrClear( (gNumProcessors - 1) *
							sizeof( sTaskData ) );
		theErr = MemError();
		if( theErr == noErr )
			theErr = MPCreateQueue( &gNotificationQueue );
		for( i = 0; i < gNumProcessors - 1 && theErr == noErr; i++ ) {
			if( theErr == noErr )
				theErr = MPCreateQueue( &gTaskData[i].requestQueue );
			if( theErr == noErr )
				theErr = MPCreateQueue( &gTaskData[i].resultQueue );
			if( theErr == noErr )
				theErr = MPCreateTask( fTask, &gTaskData[i],
						   kMPUseDefaultStackSize, gNotificationQueue,
						   NULL, NULL, kMPNormalTaskOptions,
						   &gTaskData[i].taskID );
		}
	}

	/* âΩÇÁÇ©ÇÃïsãÔçáǙdžÇÈèÍçáÇÕÅAÉVÉìÉOÉãÉvÉçÉZÉbÉTÉÇÅ[ÉhÇ…ñflÇÈ */
	if( theErr != noErr ) {
		fStopMP();
		gNumProcessors = 1;
	}
}

sWorkParams ç\ë¢ëÃÇÕÅAÉ^ÉXÉNÇ…ÇÊǡǃåƒÇ—èoÇ≥ÇÍÇÈä÷êîÇ…ìnÇ∑ÉpÉâÉÅÅ[É^ÇíËã`ǵNjÇ∑ÅBDZÇÃÉuÉçÉbÉNÇÃì‡óeÇÕÅAé¿çsÇ≥ÇÍÇÈèàóùÇÃÉ^ÉCÉvÇ…å≈óLÇÃLJÇÃÇ≈Ç∑ÅBǪÇÃíÜÇ≈LJÅADZÇÍÇÁÇÃÉpÉâÉÅÅ[É^ÇÕä÷êîÇ™èàóùÇ∑ÇÈDZÇΔDžǻǡǃǢÇÈì¡íËÇÃÉfÅ[É^ÇíËã`ǵNjÇ∑ÅB

sTaskData ç\ë¢ëÃÇÕÅAÉAÉvÉäÉPÅ[ÉVÉáÉìÇ™É^ÉXÉNÇΔÇÃä‘Ç≈Ç≥NjǥNjǻÉfÅ[É^ÇÇ‚ÇËéÊÇËÇ∑ÇÈÇΩÇflÇ…égópÇ∑ÇÈÉfÅ[É^ÇÃÉuÉçÉbÉNÇíËã`ǵNjÇ∑ÅBÇ‚ÇËéÊÇËÇ≥ÇÍÇÈ 2 ǬÇÃéÂÇ»ÉfÅ[É^ÇÕÅAÉLÉÖÅ[ ID ÇΔèàóùä÷êîÇÃÉpÉâÉÅÅ[É^Ç≈Ç∑ÅB

gNumProcessors ÉOÉçÅ[ÉoÉãÇ…ÇÕÅAÉVÉXÉeÉÄì‡Ç≈åüèoÇ≥ÇÍÇΩÉvÉçÉZÉbÉTêîÇÃÉJÉEÉìÉgÇ™äiî[Ç≥ÇÍÇ‹Ç∑ÅBÉ}ÉãÉ`ÉvÉçÉZÉbÉVÉìÉO API ÉâÉCÉuÉâÉäÇ™ÉçÅ[ÉhÇ≥ÇÍǃǢǻǢèÍçáÅAÇ‹ÇΩÇÕÅAÉ^ÉXÉNdžÇÈÇ¢ÇÕÉLÉÖÅ[ÇÃçÏê¨Ç™âΩÇÁÇ©ÇÃóùóRÇ≈é∏îsǵÇΩèÍçáÅADZÇÃïœêîÇÃílÇÕ 1 Ç…ê›íËÇ≥ÇÍÇ‹Ç∑ÅBÉAÉvÉäÉPÅ[ÉVÉáÉìÉRÅ[ÉhÇÃécÇËÇÃïîï™ÇÕÅAgNumProcessors Ç™ 1 ÇÃèÍçáÅAÉAÉvÉäÉPÅ[ÉVÉáÉìǪÇÃLJÇÃÇ™Ç∑Ç◊ǃÇÃèàóùÇé¿çsǵÅAâΩÇÁÇ©ÇÃÉ}ÉãÉ`ÉvÉçÉZÉbÉVÉìÉO API åƒÇ—èoǵÇé¿çsǵǻǢÇÊǧDžç\ê¨Ç≥ÇÍǃǢNjÇ∑ÅB

gTaskData ÉOÉçÅ[ÉoÉãÇÕÅAìÆìIÇ…äÑÇËìñǃÇÁÇÍÇΩîzóÒÇ≈džÇÈ sTaskData ÉuÉçÉbÉNÇÉ|ÉCÉìÉgǵNjÇ∑ÅBçÏê¨Ç≥ÇÍÇÈǪÇÍǺÇÍÇÃÉ^ÉXÉNÇ…ëŒÇµÇƒ 1 ǬÇÃÉGÉìÉgÉäÇ™ë∂ç›ÇµÇ‹Ç∑ÅB

gNotificationQueue ÉOÉçÅ[ÉoÉãÇÕÅAèIóπǵÇΩÉ^ÉXÉNÇ©ÇÁí ímÉÅÉbÉZÅ[ÉWÇéÛÇØéÊÇÈÇΩÇflÇ…égópÇ≥ÇÍÇ‹Ç∑ÅBDZÇÃó·Ç≈ÇÕÅAÇ∑Ç◊ǃÇÃÉ^ÉXÉNÇ™àÍǬÇÃí ímÉLÉÖÅ[Çã§óLǵǃǢNjÇ∑ÅB

ÉvÉçÉZÉbÉTêîÇ©ÇÁ 1 Çà¯Ç¢ÇΩêîÇÃÉ^ÉXÉNÇ™çÏê¨Ç≥ÇÍÇ‹Ç∑ÅBǪÇÍǺÇÍÇÃÉ^ÉXÉNÇÕÅAÉÅÉbÉZÅ[ÉWÉLÉÖÅ[ÇÃìΔé©ÇÃÉyÉAÇéùÇøÅAǪÇÍÇ…ÇÊǡǃÅAÉAÉvÉäÉPÅ[ÉVÉáÉìÇÕÉ^ÉXÉNÇΔÉfÅ[É^ÇÇ‚ÇËéÊÇËÇ≈Ç´Ç‹Ç∑ÅBÉLÉÖÅ[Çà ID ÇÕÅAÉ^ÉXÉNÇ≤ÇΔÇ… gTaskData ÉGÉìÉgÉäÇ…äiî[Ç≥ÇÍÇ‹Ç∑ÅBDZÇÃå„ÅAMPCreateTask ÇégǡǃÉ^ÉXÉNÇ™çÏê¨Ç≥ÇÍÇ‹Ç∑ÅBêÊì™ÇÃÉpÉâÉÅÅ[É^ÇÕÅAé¿çsÉ^ÉXÉNÇΔÇ»ÇÈä÷êîÇ÷ÇÃÉ|ÉCÉìÉ^Ç≈Ç∑ÅBDZÇÃó·Ç≈ÇÕÅAÇ∑Ç◊ǃÇÃÉ^ÉXÉNÇ™ fTask ÇΔǢǧìØÇ∂ä÷êîÇã§óLǵǃǢNjÇ∑ÅBdžÇÈä÷êîÇ™É}ÉãÉ`ÉvÉçÉZÉbÉTÇ…ÇÊǡǃìKêÿÇ…é¿çsÇ≥ÇÍÇÈèÍçáÅAǪÇÍÇÕ "ÉäÉGÉìÉgÉâÉìÉg" ÇΔåƒÇŒÇÍÇ‹Ç∑ÅBǻǮÅA"äÑÇËçûÇ›ÉZÅ[Ét" ÇΔǢǧDZÇΔÇÕïKÇ∏ǵLJ "ÉäÉGÉìÉgÉâÉìÉg" Çà√é¶ÇµÇ‹ÇπÇÒÅBäÑÇËçûÇ›ÇÕÅAàÍî Ç…ÅAMac ä¬ã´Ç≈ÇÕäÑÇËçûÇ›â¬î\Ç≈ÇÕÇ»Ç≠ÅAÉGÉìÉWÉjÉAÇÕÇΔǴǫǴDZÇÃDZÇΔÇóòópǵNjÇ∑ÅBǵǩǵÅAMP ä¬ã´Ç≈ÇÕÅAÉ^ÉXÉNÉRÅ[Éhì‡ÇÃîCà”ÇÃèÍèäÇ≈îCà”ÇÃÉ^ÉCÉ~ÉìÉOÇ≈ìØéûÇ…é¿çsÇ≥ÇÍÇÈï°êîÇÃÉ^ÉXÉNÇ™ë∂ç›ÇµÇ§ÇÈDZÇΔÇå©âzǵǃǮÇ≠ïKóvǙdžÇËÇ‹Ç∑ÅB

ëÊ 2 ÇÃÉpÉâÉÅÅ[É^ÇÕÅAÉ^ÉXÉNÇà gTaskData ÉGÉìÉgÉäÇ÷ÇÃÉ|ÉCÉìÉ^Ç≈Ç∑ÅBÉ^ÉXÉNÇÕÅADZÇÃÉuÉçÉbÉNÇ©ÇÁÉäÉNÉGÉXÉgÇ®ÇÊÇ—åãâ ÉLÉÖÅ[Çà ID ÇíäèoÇ≈Ç´ÇÈÇÊǧDžǻÇËÇ‹Ç∑ÅBÉ^ÉXÉNìñÇΩÇË 2 ǬÇÃÉLÉÖÅ[Ç™ïKóvÇ≈ǻǢDZÇΔLJdžÇËÇ‹Ç∑ÅBÇΩǢǃǢÇÃèÍçáÅA2 ǬÇÃÉLÉÖÅ[ÇÃçáåvílÇégópÇ∑ÇÈDZÇΔÇ™â¬î\Ç≈Ç∑ÅBÇ∑Ç◊ǃÇÃÉäÉNÉGÉXÉgÇÕàÍǬÇÃÉLÉÖÅ[Ç…É|ÉXÉgÇ≥ÇÍÅAÇ∑Ç◊ǃÇÃåãâ ÇÕï ÇÃÉLÉÖÅ[Ç…ï‘Ç≥ÇÍÇ‹Ç∑ÅBÇ«ÇÃÉ^ÉXÉNǙǫÇÃÉäÉNÉGÉXÉgÇèàóùÇ∑ÇÈǩǙñ‚ëËÇ…Ç»ÇÁǻǢÇΔÇ´ÇÕÅADZÇÃÇÊǧDžìÆçÏǵNjÇ∑ÅBÇΩÇæÇµÅAǪÇÍǺÇÍÇÃÉ^ÉXÉNÇ…ëŒÇ∑ÇÈÉpÉâÉÅÅ[É^ÇÕÅAÉÅÉbÉZÅ[ÉWì‡Ç…äÆëSÇ…ä‹Ç‹ÇÍǃǢÇÈÇ©ÅAç≈èâÇÃÉäÉNÉGÉXÉgÇÉTÉuÉ~ÉbÉgÇ∑ÇÈëOÇ…Ç∑Ç◊ǃÇÃÉ^ÉXÉNÇ…ëŒÇµÇƒÇ†ÇÁÇ©Ç∂ÇflämóßÇ≥ÇÍǃǢÇÈïKóvǙdžÇËÇ‹Ç∑ÅB

ëÊ 3 ÇÃÉpÉâÉÅÅ[É^ÇÕÅAÉ^ÉXÉNÇ…égópÇ∑ÇÈñ⁄ìIÇÃÉXÉ^ÉbÉNÉTÉCÉYÇ≈Ç∑ÅBǪÇÍǺÇÍÇÃÉ^ÉXÉNÇÕìΔé©ÇÃÉXÉ^ÉbÉNÇéùÇøÇ‹Ç∑ÅBëΩêîÇÃÉ^ÉXÉNÇçÏê¨ÇµÇÊǧÇΔǵǃǢÇÈèÍçáÇÕÅAǪÇÍǺÇÍÇÃÉ^ÉXÉNÇ™éÛÇØéÊÇÈDZÇΔÇ…Ç»ÇÈÉXÉ^ÉbÉNÇÃÉTÉCÉYÇ…êßå¿Çâ¡Ç¶ÇÈDZÇΔÇåüì¢ÇµÇƒÇ≠ÇæÇ≥Ç¢ÅBÉfÉtÉHÉãÉgÇÃÉTÉCÉYÇÕ 64K Ç≈džÇËÅADZÇÃílÇǪÇÃNjNjégópÇ∑ÇÈÇΔÅAîÒèÌÇ…ëΩÇ≠ÇÃÉ^ÉXÉNÇçÏê¨ÇµÇÊǧÇΔǵǃǢÇÈèÍçáÇÕÅAÉ}ÉãÉ`ÉvÉçÉZÉbÉVÉìÉO API ÉâÉCÉuÉâÉäÇ™égópÇ≈Ç´ÇÈÉÅÉÇÉäóeó ÇǩǻÇËà≥îóǵǃǵNjǧèÍçáǙdžÇËÇ‹Ç∑ÅBÉXÉ^ÉbÉNÉTÉCÉYÇéwíËÇ∑ÇÈÇΔÇ´ÇÕÅAÉ^ÉXÉNÇÃç≈LJê[Ç¢åƒÇ—èoǵÉ`ÉFÅ[ÉìÇ™ïKóvÇΔÇ∑ÇÈç≈è¨å¿ÇÃÉXÉyÅ[ÉXÇäÑÇËìñǃÇÈÇÊǧDžíçà”ǵǃÇ≠ÇæÇ≥Ç¢ÅB

ëÊ 4 ÇÃÉpÉâÉÅÅ[É^ÇÕÅAè»ó™â¬î\Ç»í ímÉLÉÖÅ[Ç…ëŒÇ∑ÇÈLJÇÃÇ≈Ç∑ÅBDZÇÃÉLÉÖÅ[ÇÕÅAÉ^ÉXÉNÇÃèIóπÉVÅ[ÉPÉìÉXÇ≈ÇÕîÒèÌÇ…èdóvÇ…Ç»ÇËÇ‹Ç∑ÅBÉ^ÉXÉNǪÇÃLJÇÃÇégǡǃÉ^ÉXÉNÇÃèIóπÇåµñßÇ…ÉRÅ[ÉfÉBÉlÅ[ÉgǵǻǢèÍçáÅADZÇÃÉpÉâÉÅÅ[É^ÇÕéñé¿è„è»ó™â¬î\Ç≈ÇÕdžÇËÇ‹ÇπÇÒÅBåxçêǻǵDžÉ^ÉXÉNÇèIóπÇ∑ÇÈèÍçáÇÕÅAí ímÉLÉÖÅ[ÇÕê‚ëŒÇ…ïKóvÇ…Ç»ÇËÇ‹Ç∑ÅBǪÇÃóùóRDžǬǢǃÇÕå„èqǵNjÇ∑ÅB

ëÊ 5 Ç®ÇÊÇ— ëÊ 6 ÇÃÉpÉâÉÅÅ[É^ÇÕÅAÉ^ÉXÉNÇ™èIóπÇ∑ÇÈÇΔÇ´Ç…í ímÉLÉÖÅ[Ç…ï‘Ç≥ÇÍÇ‹Ç∑ÅB

ëÊ 7 ÇÃÉpÉâÉÅÅ[É^ÇÕÅAÉ^ÉXÉNçÏê¨ÇÃê´éøÇïœçXÇ∑ÇÈÇΩÇflÇ…égópǵNjÇ∑ÅBåªç›ÇÃÇΔDZÇÎÅAégópâ¬î\Ç»ÉIÉvÉVÉáÉìÇÕdžÇËÇ‹ÇπÇÒÅB

ëÊ 8 ÇÃÉpÉâÉÅÅ[É^ÇÕÅAMPCreateTask Ç…ÇÊǡǃñÑÇflÇÁÇÍÇ‹Ç∑ÅBDZÇÃÉpÉâÉÅÅ[É^ÇÕÅAêVǵÇ≠çÏê¨Ç≥ÇÍÇΩÉ^ÉXÉNÇà ID ÇΔÇ»ÇËÇ‹Ç∑ÅBï÷ãXè„ÅADZÇÃÉpÉâÉÅÅ[É^ÇÕÅAÉ^ÉXÉNÇà gTaskData ÉGÉìÉgÉäÇ…äiî[Ç≥ÇÍÇ‹Ç∑ÅBÇΩÇæÇµÅAÉ^ÉXÉNǙǪÇÍÇÁÇà ID ÇímÇÈïKóvÇÕÇŸÇΔÇÒǫdžÇËÇ‹ÇπÇÒÅB

É^ÉXÉNÇÃçÏê¨íÜÇ…âΩÇÁÇ©ÇÃñ‚ëËÇ™î≠ê∂Ç∑ÇÈÇΔÅAfStopMP Ç™åƒÇ—èoÇ≥ÇÍÇ‹Ç∑ÅBDZÇÃåƒÇ—èoǵDžÇÊÇËÅAǪÇÍÇ‹Ç≈Ç…çÏê¨Ç≥ÇÍÇΩÇ∑Ç◊ǃÇÃLJÇÃÇ™çÌèúÇ≥ÇÍǃèIóπǵNjÇ∑ÅBÇ≥ÇÁÇ…ÅAgNumProcessors ïœêîÇÃílÇ™ 1 Ç…ê›íËÇ≥ÇÍÇ‹Ç∑ÅBǪÇÃåãâ ÅAÉAÉvÉäÉPÅ[ÉVÉáÉìÇÕégópâ¬î\Ç»ÉvÉçÉZÉbÉTÇ™àÍǬǵǩǻǢǩÇÃÇÊǧDžèàóùÇåpë±ÇµÇ‹Ç∑ÅBfStopMP ä÷êîÇÃè⁄ç◊DžǬǢǃÇÕå„èqǵNjÇ∑ÅB

éüÇ…ÅAÉTÉìÉvÉãÉ^ÉXÉNÇé¶ÇµÇ‹Ç∑ÅBDZÇÃÉ^ÉXÉNÇ™ç≈èâÇ…é¿çsÇ∑ÇÈDZÇΔÇÕÅAMPCreateTask Ç≈éwíËÇ≥ÇÍǃǢÇÈ gTaskData ÉGÉìÉgÉäÇ÷ÇÃÉ|ÉCÉìÉ^ÇämóßÇ∑ÇÈDZÇΔÇ≈Ç∑ÅBÉ^ÉXÉNÇÕÅADZÇÃÉuÉçÉbÉNÇ©ÇÁÉäÉNÉGÉXÉgÇ®ÇÊÇ—åãâ ÉLÉÖÅ[ÇéÊìæÇµÇ‹Ç∑ÅBǪÇÃå„ÅAÉ^ÉXÉNÇÕÉäÉNÉGÉXÉgÉLÉÖÅ[è„Ç≈ÉäÉNÉGÉXÉgÇë“ÇøÇ‹Ç∑ÅBÉ^ÉXÉNÇÕÅAéÛÇØéÊÇ¡ÇΩÉÅÉbÉZÅ[ÉWÇégǡǃÅAåƒÇ—èoÇ∑ä÷êîÇëIëǵNjÇ∑ÅBä÷êîÇ…égópÇ∑ÇÈÉpÉâÉÅÅ[É^ÇÕÅAÉ^ÉXÉNÇà gTaskData ÉGÉìÉgÉäÇ©ÇÁíäèoÇ≥ÇÍÇ‹Ç∑ÅBDZÇÃÉGÉìÉgÉäÇÕÅAÉäÉNÉGÉXÉgÉÅÉbÉZÅ[ÉWÇÉ|ÉXÉgÇ∑ÇÈëOÇ…ÅAÉAÉvÉäÉPÅ[ÉVÉáÉìÇ…ÇÊǡǃÉZÉbÉgÉAÉbÉvÇ≥ÇÍǃǢNjÇ∑ÅBÉAÉvÉäÉPÅ[ÉVÉáÉìÇ≈ÇÕÅAÉ^ÉXÉNǙǪÇÃåãâ ÉÅÉbÉZÅ[ÉWÇëóêMÇ∑ÇÈÇ‹Ç≈ÅAÉ^ÉXÉNÇ…ìnÇ∑Ç∑Ç◊ǃÇÃÉpÉâÉÅÅ[É^ÇÃóLå¯ê´Çà€éùÇ∑ÇÈÇΩÇflÇ…ç◊êSÇÃíçà”Çï•ǧïKóvǙdžÇËÇ‹Ç∑ÅBÇΩÇΔǶnjÅAåªç›é¿çsÇ≥ÇÍǃǢÇÈÉ^ÉXÉNÇ…ÇÊǡǃèëÇ´çûÇ‹ÇÍÇΩÉÅÉÇÉäÇà⁄ìÆÇµÇΩÇËçÌèúǵÇΩÇËÇ∑ÇÈÇΔÅAÉAÉvÉäÉPÅ[ÉVÉáÉìÇÕîjã«ìIÇ»éñë‘Ç…ä◊ǡǃǵNjǢNjÇ∑ÅB

#define kMyRequestOne 1
#define kMyRequestTwo 2
#define kMyResultException -1

OSStatus fTask( void *parameter ) {
	OSErr theErr;
	sTaskDataPtr p;
	Boolean finished;
	long message;
	theErr = noErr;

	/* DZÇÃÉ^ÉXÉNÇÃÉÜÉjÅ[ÉNÇ»ÉfÅ[É^Ç÷ÇÃÉ|ÉCÉìÉ^ÇéÊìæÇ∑ÇÈ */
	p = (sTaskDataPtr)parameter ;
	
	/* É^ÉXÉNÇ…ìnǵÇΩäeÉäÉNÉGÉXÉgÇèàóùǵÅAåãâ Çï‘Ç∑ */
	finished = false;
	while( !finished ) {
		theErr = MPWaitOnQueue( p->requestQueue, (void **)&message,
							NULL, NULL, kDurationForever );
		if( theErr == noErr ) {
			/* åƒÇ—èoÇ∑ä÷êîÇëIëǵÅAÉpÉâÉÅÅ[É^ÇìnÇ∑ */
			/* ÉpÉâÉÅÅ[É^ÇÕÅAÉ^ÉXÉNÇ™éÛÇØéÊÇ¡ÇΩÉÅÉbÉZÅ[ÉWÇëóêMÇ∑ÇÈëOÇ… */
			/* Ç∑Ç≈Ç…ÉZÉbÉgÉAÉbÉvÇ≥ÇÍǃǢÇÈÅBÉZÉåÉNÉ^ÇégópÇ∑ÇÈë„ÇÌÇËÇ…ÅA */
			/* ñ⁄ìIÇÃä÷êîÇ÷ÇÃÉ|ÉCÉìÉ^ÇìnÇ∑DZÇΔLJÇ≈Ç´ÇÈ */
			switch( message ) {
				case kMyRequestOne:
					theErr = fMyTaskFunctionOne( &p->params );
					break;

				case kMyRequestTwo:
					theErr = fMyTaskFunctionTwo( &p->params );
					break;

				default:
					finished = true;
					theErr = kMyResultException;
			}
			MPNotifyQueue( p->resultQueue, (void *)theErr, NULL, NULL );
		}
		else
			finished = true;
	}
	/* É^ÉXÉNÇÕDZÇÍÇ≈èIóπ */
	return( theErr );
}

É^ÉXÉNÇégÇ¡ÇΩèàóùÇÃé¿çs
Ç¢Ç≠ǬǩÇÃèàóùÇÃé¿çsÇïKóvÇΔÇ∑ÇÈÇΔÇ´ÅAÉAÉvÉäÉPÅ[ÉVÉáÉìÇÕÉ^ÉXÉNÇ…ïKóvǻLJÇÃÇ™Ç∑Ç◊ǃÉÅÉÇÉäì‡Ç…ë∂ç›Ç∑ÇÈDZÇΔÇämîFǵNjÇ∑ÅBǪÇÍǺÇÍÇÃÉ^ÉXÉNÇ…ëŒÇµÇƒÅAÉAÉvÉäÉPÅ[ÉVÉáÉìÇÕÅAÉ^ÉXÉNÇ…é¿çsÇ≥ÇπÇΩÇ¢èàóùÇÃÉpÉâÉÅÅ[É^ÇämóßǵÅAÇ≥ÇÁÇ… Queue Ç‹ÇΩÇÕ Semaphore ÇÃÇ¢Ç∏ÇÍÇ©ÇâÓǵǃÅAǪÇÃèàóùÇé¿çsÇ∑ÇÈÉ^ÉXÉNÇ…ÉVÉOÉiÉãÇëóÇËÇ‹Ç∑ÅBÉ^ÉXÉNÇ™é¿çsÇ∑ÇÈì¡íËÇÃèàóùÇÕÅAÉÅÉbÉZÅ[ÉWÇÃì‡ïîÇ≈äÆëSÇ…íËã`Ç∑ÇÈDZÇΔÇ™Ç≈Ç´Ç‹Ç∑ÅBÇ‹ÇΩÅAëOèqǵÇΩÇÊǧDžÅAǪÇÃÉ^ÉXÉNÇÃÇΩÇflÇ…ó\ñÒÇ≥ÇÍǃǢÇÈÉÅÉÇÉäÉuÉçÉbÉNÇÃíÜÇ≈íËã`Ç∑ÇÈDZÇΔLJâ¬î\Ç≈Ç∑ÅBÇ¢Ç∏ÇÍÇÃï˚ñ@LJàÍî ìIÇ…égópÇ≥ÇÍÇ‹Ç∑ÅBàÍïîÇÃÉAÉvÉäÉPÅ[ÉVÉáÉìÇ≈ÇÕÅAèàóùÇé¿çsÇ∑ÇÈÇΩÇflÇ…É^ÉXÉNÇ™åƒÇ—èoÇ∑ä÷êîÇ÷ÇÃÉ|ÉCÉìÉ^ÇìnÇ∑DZÇΔLJdžÇËÇ‹Ç∑ÅBDZÇÃï˚ñ@Ç…ÇÊÇËÅAàÍǬÇÃÉ^ÉXÉNÇ™ëΩêîÇÃÉ^ÉCÉvÇ™àŸÇ»ÇÈèàóùÇé¿çsÇ∑ÇÈDZÇΔÇ™Ç≈Ç´Ç‹Ç∑ÅB

É^ÉXÉNÇ©ÇÁÉVÉOÉiÉãÇ™èoÇ≥ÇÍÇÈÇΔÅAÉAÉvÉäÉPÅ[ÉVÉáÉìÇÕèàóùÇéËì`ǧDZÇΔLJÇ≈Ç´Ç‹Ç∑ÅBÇ‹ÇΩÅAé©ï™ÇÃÉCÉxÉìÉgÉãÅ[ÉvÇ…ñflÇËÅAǪÇÃéûì_Ç≈ kDurationImmediate ë“ã@ÇégǡǃǢÇÈÉ^ÉXÉNÇÉ`ÉFÉbÉNÇ∑ÇÈèÍçáLJdžÇËÇ‹Ç∑ÅB

kDurationImmediate Ç™ MPWaitOnQueueÅAMPWaitOnSemaphoreÅAÇ‹ÇΩÇÕ MPEnterCriticalRegion Ç…éwíËÇ≥ÇÍǃǢÇÈÇΔÇ´ÅAä÷êîÇÕë¶ç¿Ç…ílÇï‘ǵNjÇ∑ÅBñflÇËílÇ™ kMPTimeoutErr ÇÃèÍçáÅAë“ÇΩÇÍǃǢÇΩLJÇÃÇÕâΩLJéÊìæÇ≈Ç´Ç‹ÇπÇÒÅBǬNjÇËÅAÉÅÉbÉZÅ[ÉWÇÕégópÇ≈Ç´Ç∏ÅASemaphore ÇÕÉ[ÉçÇ≈ÅACritical Region ÇÕï ÇÃÉvÉçÉZÉbÉTÇ…ÇÊǡǃé¿çsÇ≥ÇÍÇΩÇΔǢǧDZÇΔÇ≈Ç∑ÅB

DZÇÃÇΩÇflÅAÉAÉvÉäÉPÅ[ÉVÉáÉìǙǪÇÃÉCÉxÉìÉgÉãÅ[ÉvÇÃíÜÇ≈É^ÉXÉNÇÃåãâ ÇÉ`ÉFÉbÉNǵǃǢÇÈèÍçáÅAkDurationImmediate ë“ã@ÇégǡǃÅAñflÇËílÇÉ`ÉFÉbÉNǵNjÇ∑ÅBñflÇËílÇ™ noErr ÇÃèÍçáÅAåãâ ÇÕë∂ç›ÇµÅAåƒÇ—èoǵDžÇÊǡǃéÊìæÇ≥ÇÍNjǵÇΩÅBàÍï˚ÅAñflÇËílÇ™ kMPTimeoutErr ÇÃèÍçáÅAÉAÉvÉäÉPÅ[ÉVÉáÉìÇ™ç≈å„Ç…É`ÉFÉbÉNÇçsÇ¡ÇΩå„Ç≈ÅAÉ^ÉXÉNÇÕêVǵǢåãâ ÇâΩLJê∂ê¨ÇµÇ‹ÇπÇÒÇ≈ǵÇΩÅBÇ‡ÇøÇÎÇÒÅADZÇÍà»äOÇÃéÌófiÇÃÉGÉâÅ[Ç™ï‘Ç≥ÇÍÇÈDZÇΔLJdžÇËÇ‹Ç∑ÅB

ëOèqǵÇΩÇÊǧDžÅAÉäÉNÉGÉXÉgÇÃèàóùÇèIóπÇ∑ÇÈÇΔÇ´ÅAÉ^ÉXÉNÇÕåãâ ÇÉ|ÉXÉgǵǃÅAèàóùÇ™é¿çsÇ≥ÇÍÇΩDZÇΔÇÉAÉvÉäÉPÅ[ÉVÉáÉìÇ…ímÇÁÇπÇ‹Ç∑ÅB

éüÇ…ÅAÉ^ÉXÉNÇégópǵǃèàóùÇé¿çsÇ∑ÇÈÉAÉvÉäÉPÅ[ÉVÉáÉìÇÃéñó·Çé¶ÇµÇ‹Ç∑ÅBDZÇÃèÍçáÅAÉAÉvÉäÉPÅ[ÉVÉáÉìLJèàóùÇÃàÍïîÇé¿çsǵNjÇ∑ÅBǻǮÅADZÇÃÉAÉvÉäÉPÅ[ÉVÉáÉìÇ≈ÇÕÅAÉCÉxÉìÉgÇÕèàóùÇ≥ÇÍÇ‹ÇπÇÒÅBǬNjÇËÅAfMyTaskFunctionOne Ç™èàóùÇé¿çsÇ∑ÇÈÇΩÇflÇ… 1/10 ïbà»è„ÇÃéûä‘ÇÇΔÇÁǻǢDZÇΔÇ™ëOíÒDžǻǡǃǢNjÇ∑ÅB

OSErr fDoMP( long realFirstThing, long realTotalThings ) {
	long i;
	OSErr theErr;
	long thingsPerTask;
	long message;
	sWorkParams appData;

	theErr = noErr;
	thingsPerTask = realTotalThings / gNumProcessors;

	/* ÉfÅ[É^ëSëÃÇç\ê¨Ç∑ÇÈÉÜÉjÅ[ÉNÇ»ïîï™ÇëŒè€Ç…
	ǪÇÍǺÇÍÇÃÉ^ÉXÉNÇÃèàóùÇäJénÇ∑ÇÈ */
	for( i = 0; i < gNumProcessors - 1; i++ ) {
		gTaskData[i].params.firstThing = realFirstThing + thingsPerTask * i;
		gTaskData[i].params.totalThings = thingsPerTask;
		message = kMyRequestOne;
		MPNotifyQueue( gTaskData[i].requestQueue, (void *)message,
								NULL, NULL );
	}

	/* ÉAÉvÉäÉPÅ[ÉVÉáÉìÇ…écÇ¡ÇΩèàóùÇé¿çsÇ≥ÇπÇÈÅBgNumProcessors Ç™ */
	/* 1 ÇÃèÍçáÅAÉAÉvÉäÉPÅ[ÉVÉáÉìÇ™Ç∑Ç◊ǃÇÃèàóùÇé¿çsÇ∑ÇÈDZÇΔÇ…Ç»ÇËÅA */
	/* É}ÉãÉ`ÉvÉçÉZÉbÉVÉìÉO API ÉâÉCÉuÉâÉäÇÕåƒÇ—èoÇ≥ÇÍǻǢ */
	appData.firstThing = realFirstThing + thingsPerTask * i;
	appData.totalThings = realTotalThings - thingsPerTask * i;
	fMyTaskFunctionOne( &appData );

	/* É^ÉXÉNÇ™èIóπÇ∑ÇÈÇ‹Ç≈ë“ã@Ç∑ÇÈ */
	for( i = 0; i < gNumProcessors - 1; i++ )
		MPWaitOnQueue( gTaskData[i].resultQueue, (void **)&message,
					NULL, NULL, kDurationForever );
	return( theErr );
}


DZÇÃÇÊǧǻÉAÉvÉçÅ[É`ÇÕëΩêîÇÃåªé¿ÇÃÉAÉvÉäÉPÅ[ÉVÉáÉìÇ≈égópÇ≥ÇÍǃǢNjÇ∑ÅBì¡Ç…ÅAãêëÂÇ»ÉfÅ[É^ÉuÉçÉbÉNÇïœå`Ç∑ÇÈÉAÉvÉäÉPÅ[ÉVÉáÉìÇ…ç≈ìKÇ≈Ç∑ÅBÉfÅ[É^ÇÕÉ^ÉXÉNÇ≈égópÇ∑ÇÈÇΩÇflÇ…ÉTÉCÉYÇÃìôǵǢïîï™Ç…ï™äÑÇ≥ÇÍÅAÉ^ÉXÉNÇ™äJénÇ≥ÇÍÇ‹Ç∑ÅBÇ≥ÇÁÇ…ÅAécÇ≥ÇÍÇΩÉTÉCÉYÇ™ìôǵÇ≠ǻǢïîï™ÇÕÉAÉvÉäÉPÅ[ÉVÉáÉìÇ…ÇÊǡǃèàóùÇ≥ÇÍÇ‹Ç∑ÅBécÇ≥ÇÍÇΩïîï™ÇÃèàóùÇ™èIóπÇ∑ÇÈÇΔÅAÉAÉvÉäÉPÅ[ÉVÉáÉìÇÕÉ^ÉXÉNÇ™èIóπÇ∑ÇÈÇÃÇë“ÇøÇ‹Ç∑ÅBǻǮÅAÉfÅ[É^Ç™ÉvÉçÉZÉbÉTÇÃêîÇ≈äÑÇËêÿÇÍÇÈÇΔÇÕñ≥èåèÇ…ëzíËǵǻǢÇ≈Ç≠ÇæÇ≥Ç¢ÅBDZÇÃåÎÇËÇÕåoå±ñLǩǻÉGÉìÉWÉjÉAÇ≈Ç≥ǶîΔÇ∑èÍçáǙdžÇËÇ‹Ç∑ÅB

ï°êîÇÃÉtÉ@ÉCÉãÇìØéûÇ…ÉRÉìÉpÉCÉãǵÇÊǧÇΔÇ∑ÇÈäJî≠ä¬ã´Ç»Ç«ÅAÉTÉCÉYÇ™ìôǵÇ≠ǻǢÉTÉCÉYÇÃëÂÇ´Ç»ïîï™ÇèàóùÇ∑ÇÈÉAÉvÉäÉPÅ[ÉVÉáÉìÇ≈ÇÕÅAàŸÇ»ÇÈÉAÉvÉçÅ[É`Ç™ïKóvÇ…Ç»ÇËÇ‹Ç∑ÅBDZÇÃÇÊǧǻÉAÉvÉäÉPÅ[ÉVÉáÉìÇ≈ÇÕÉCÉxÉìÉgÉãÅ[ÉvÇégópǵÅAǪÇÍǺÇÍÇÃÉ^ÉXÉNÇ™äÑÇËìñǃÇÁÇÍÇΩèàóùÇèIóπÇ∑ÇÈÇΔÇ´ÅAïKóvÇ…âûÇ∂ǃÅAêVǵǢèàóùÇÉ^ÉXÉNÇ…äÑÇËìñǃÇÈÇÊǧDžǵNjÇ∑ÅB


É^ÉXÉNÇÃèIóπ
ÉAÉvÉäÉPÅ[ÉVÉáÉìÇ™èIóπÇ∑ÇÈÇΔÇ´ÅAMPTerminateTask ÇåƒÇ—èoǵNjÇ∑ÅBÇΩÇæÇµÅAMPTerminateTask ÇÕé¿çsíÜÇÃÉ^ÉXÉNÇë¶ç¿Ç…çÌèúÇ∑ÇÈÇÌÇØÇ≈ÇÕdžÇËÇ‹ÇπÇÒÅBǪÇÍÇ™è´óàÇÃìKêÿÇ»éûä˙Ç…çÌèúÇ≥ÇÍÇÈÇΔǢǧÉtÉâÉOÇê›íËÇ∑ÇÈÇæÇØÇ≈Ç∑ÅBDZÇÃÇΩÇflÅAÉ^ÉXÉNÇ™é¿ç€Ç…èIóπÇ∑ÇÈÇ‹Ç≈ÅAÉ^ÉXÉNÇ™égópǵǃǢÇÈÉäÉ\Å[ÉXÇçÌèúǵǻǢDZÇΔÇ™îÒèÌÇ…èdóvÇ≈Ç∑ÅBDZÇÃDZÇΔÇämé¿Ç…çsǧDžÇÕÅAMPCreateTask åƒÇ—èoǵÇÃÇΩÇflÇ…ópà”Ç≥ÇÍÇΩí ímÉLÉÖÅ[Çë“ǡǃÇ≠ÇæÇ≥Ç¢ÅBMPTerminateTask ÇåƒÇ—èoÇ∑ÇΩÇ—Ç…ÅAÉÅÉbÉZÅ[ÉWÇΔǵǃÇÃí ímÉLÉÖÅ[Çë¶ç¿Ç…ë“ǬÇÊǧDžǵǃÇ≠ÇæÇ≥Ç¢ÅBí ímÉLÉÖÅ[ÇéÛÇØéÊÇÍÇŒÅAÉ^ÉXÉNǙLJÇÕÇ‚é¿çsÇ≥ÇÍǃǢǻǢDZÇΔÇämîFÇ≈Ç´ÅAÇ≥ÇÁÇ…ã§óLÉäÉ\Å[ÉXÇçÌèúǵǃLJà¿ëSÇ≈džÇÈDZÇΔÇ™ÇÌÇ©ÇËÇ‹Ç∑ÅB

éüÇà fStopMP ä÷êîÇÕÅAÉAÉvÉäÉPÅ[ÉVÉáÉìÇ™èIóπǵÇÊǧÇΔÇ∑ÇÈÇΔÇ´Ç…é¿çsÇ≥ÇÍÇÈLJÇÃÇÃéñó·Ç≈Ç∑ÅBfStopMP Ç…ä÷ǵǃíçà”Ç∑Ç◊Ç´èdóvÉ|ÉCÉìÉgÇÃàÍǬÇÕÅAMPTerminateTask ÇégǡǃÉ^ÉXÉNÇ™èIóπÇ≥ÇÍÇΩÇÁÇ∑ÇÆÇ…ÅAí ímÉLÉÖÅ[Ç…ÉÅÉbÉZÅ[ÉWÇ™ìûíÖÇ∑ÇÈÇ‹Ç≈ä÷êîÇÃé¿çsÇàÍéûí‚é~Ç∑ÇÈDZÇΔÇ≈Ç∑ÅB

void fStopMP( void ) {
	long i;

	if( gTaskData != NULL ) {
		for( i = 0; i < gNumProcessors - 1; i++ ) {
			if( gTaskData[i].taskID != NULL ) {
				MPTerminateTask( gTaskData[i].taskID, noErr );
				MPWaitOnQueue( gNotificationQueue, NULL,
						NULL, NULL, kDurationForever );
			}
			if( gTaskData[i].requestQueue != NULL )
				MPDeleteQueue( gTaskData[i].requestQueue );
			if( gTaskData[i].resultQueue != NULL )
				MPDeleteQueue( gTaskData[i].resultQueue );
		}
		if( gNotificationQueue != NULL ) {
			MPDeleteQueue( gNotificationQueue );
			gNotificationQueue = NULL;
		}
		DisposePtr( (Ptr)gTaskData );
		gTaskData = NULL;
	}
}




É}ÉãÉ`ÉvÉçÉZÉbÉVÉìÉOÇ≈ǂǡǃǢǢDZÇΔÇΔÅAǂǡǃÇÕÇ¢ÇØÇ»Ç¢Ç±ÇΔ

ǂǡǃǢǢDZÇΔ
ÉXÉ^Å[ÉgÉAÉbÉvéûÇ…ÅAÉÅÉÇÉäïsë´ÇÃÇΩÇflÇ… MPLibrary ÇÉçÅ[ÉhÇ∑ÇÈDZÇΔÇ™Ç≈ǴǻǢÇΔǢǧÉÅÉbÉZÅ[ÉWÇ™ï\é¶Ç≥ÇÍÇΩèÍçáÇÕÅAResEdit Ç‹ÇΩÇÕ Resourcer ÇégǡǃÅAÅgã@î\ägí£ÅhÉtÉHÉãÉ_DždžÇÈ Metronub ÇÃÉRÉsÅ[ÇäJǢǃÇ≠ÇæÇ≥Ç¢ÅB'sysz' ÉäÉ\Å[ÉXÇÃílÇ 2500000 Ç…ïœçXǵNjÇ∑ÅBǪÇÍÇ≈LJñ‚ëËÇ™â¸ëPÇ≥ÇÍǻǢèÍçáÇÕÅA'sysz' ÇÃílÇàÍìxÇ… 1MB Ç∏Ǭëùâ¡Ç≥ÇπǃÅAñ‚ëËÇâåàǵǃÇ≠ÇæÇ≥Ç¢ÅB

É^ÉXÉNÇÕÉtÉFÉCÉXÉåÉXèàóùÇé¿çsÇ∑ÇÈä÷êîÇåƒÇ—èoǵNjÇ∑ÅBåvéZíÜêSÇÃÉRÅ[ÉhÇÕÅAMP É^ÉXÉNÇÃégópÇåüì¢Ç∑Ç◊Ç´óBàÍÇÃÉ^ÉCÉvÇÃÉRÅ[ÉhÇ≈Ç∑ÅBDZÇÃÉãÅ[ÉãÇÕÅAMac OS 8 Ç≈ÇÕǩǻÇËä…òaÇ≥ÇÍNjǵÇΩÇ™ÅAåvéZíÜêSÇÃÉRÅ[ÉhÇ… MP ÇégópÇ∑ÇÈDZÇΔÇ≈ÅAÉXÉãÅ[ÉvÉbÉgÇ™îÚñÙìIÇ…å¸è„Ç∑ÇÈÇÃLJéñé¿Ç≈Ç∑ÅBMac OS 8 Ç≈ÇÕÅAï ÇÃÉ^ÉCÉvÇÃÉRÅ[ÉhÇÉ}ÉãÉ`É^ÉXÉNâªÇ∑ÇÈDZÇΔÇ≈âûìöê´Ç™Ç©Ç»ÇËâ¸ëPÇ≥ÇÍǃǢNjÇ∑ÅB

ÉäÉNÉGÉXÉgÇ®ÇÊÇ—åãâ ÉVÉOÉiÉãÇÃä‘Ç…É^ÉXÉNÇ…ÇÊǡǃé¿çsÇ≥ÇÍÇÈèàóùÇÕ "é¿éøìI" ǻLJÇÃÇ≈Ç∑ÅBìØä˙ÉÅÉ\ÉbÉhÇÃÇ¢Ç∏ÇÍÇ©åoóRÇ≈ÉVÉOÉiÉãÇÃëóêMÇ‹ÇΩÇÕéÛêMÇçsǧDžÇÕÅAêîïSÉ}ÉVÉìÉTÉCÉNÉãÇóvǵNjÇ∑ÅBÉ^ÉXÉNÇ™ÉäÉNÉGÉXÉgÇ≥ÇÍÇΩèàóùÇäÆóπÇ∑ÇÈÇ‹Ç≈Ç…êîÉTÉCÉNÉãǵǩǩǩÇÁǻǢèÍçáÅAÉAÉvÉäÉPÅ[ÉVÉáÉìÇÃÉpÉtÉHÅ[É}ÉìÉXÇÕÅAÉ}ÉãÉ`ÉvÉçÉZÉbÉVÉìÉOÇégǧDZÇΔÇ≈åÄìIÇ…í·â∫ǵNjÇ∑ÅBÉ^ÉXÉNÇÕÅAàÍǬÇÃÉäÉNÉGÉXÉgìñÇΩÇËè≠Ç»Ç≠ÇΔLJïSñúÉTÉCÉNÉãÇè¡îÔÇ∑ÇÈïKóvǙdžÇËÇ‹Ç∑ÅB200MHz ÇÃÉvÉçÉZÉbÉTÇ≈ÇÕÅADZÇÍÇÕ 5 É~ÉäïbÇ…ëäìñǵÅADZÇÃï∂èëëSëÃÇ≈à¯ópÇ≥ÇÍǃǢÇÈ 1/10 ïbÇÃâûìöéûä‘Ç…î‰Ç◊ÇÈÇΔ 20 î{ë¨Ç¢Ç±ÇΔÇ…Ç»ÇËÇ‹Ç∑ÅB

É^ÉXÉNÇ™ÉÅÉÇÉäÇÃäÑÇËìñǃÇïKóvÇΔǵǃǢÇÈèÍçáÇÕÅAÉ^ÉXÉNÇ™ÉVÉOÉiÉãÇèoÇ∑ëOÇ…ÉÅÉÇÉäÇäÑÇËìñǃÇÈÇ©ÅAMPAllocate ä÷êîÇégópÇ∑ÇÈïKóvǙdžÇËÇ‹Ç∑ÅBMPAllocate ä÷êîÇÕÅAÉAÉvÉäÉPÅ[ÉVÉáÉìÇÃÉÅÉÇÉäÇ©ÇÁäÑÇËìñǃÇÁÇÍÇΩÉÅÉÇÉäÉuÉçÉbÉNÇï‘ǵNjÇ∑ÅBǵǩǵécîOǻDZÇΔÇ…ÅAMPAllocate ÇÃèàóùë¨ìxÇÕîÒèÌÇ…í·ë¨Ç≈Ç∑ÅBMPAllocate Çé¿çsÇ∑ÇÈÇΔÉ^ÉXÉNÇ™íÜífÇ≥ÇÍǃǵNjǢÅAÉAÉvÉäÉPÅ[ÉVÉáÉìÇ™ÉäÉNÉGÉXÉgÇñûë´Ç∑ÇÈDZÇΔÇóvãÅǵÅAǪÇÃå„Ç≈É^ÉXÉNÇÉåÉWÉÖÅ[ÉÄǵNjÇ∑ÅBMPAllocate ÇëΩópÇ∑ÇÈÇΔÅAÉ^ÉXÉNÇÃÉXÉãÅ[ÉvÉbÉgÇ™îÒèÌÇ…í·â∫ǵNjÇ∑ÅBÉÅÉÇÉäÇämï€Ç∑ÇÈÇΩÇflÇÃç≈ëPÇÃÉ\ÉäÉÖÅ[ÉVÉáÉìÇÕÅAdžÇÁÇ©Ç∂ÇflÇ≈Ç´ÇÈÇæÇØëΩÇ≠ÇÃÉÅÉÇÉäÇäÑÇËìñǃǃǵNjǧDZÇΔÇ≈Ç∑ÅBDZÇÍÇ™ïsâ¬î\Ç»èÍçáÇÕÅAMPAllocate ÇégǡǃÅAàÍìxÇ…ÉTÉCÉYÇÃëÂÇ´Ç»ÉÅÉÇÉäÉyÅ[ÉWÇàÍÇ¬ÇæÇØäÑÇËìñǃÅAïKóvÇ…âûÇ∂ǃÅAǪÇÃÉyÅ[ÉWÇ©ÇÁÇÊÇËè¨Ç≥Ç»ÉuÉçÉbÉNÇà¯Ç´èoǵNjÇ∑ÅB

ǂǡǃÇÕÇ¢ÇØÇ»Ç¢Ç±ÇΔ
68K ÇÃÉRÅ[ÉhÇåƒÇ—èoÇ≥ǻǢÇ≈Ç≠ÇæÇ≥Ç¢ÅBÉZÉJÉìÉhÉvÉçÉZÉbÉTè„Ç…ÇÕÉGÉ~ÉÖÉåÅ[É^Ç™ë∂ç›ÇµÇ»Ç¢ÇΩÇflÅAÉ~ÉbÉNÉXÉhÉÇÅ[ÉhÉXÉCÉbÉ`Çé¿çsǵÇÊǧÇΔÇ∑ÇÈÇΔÅAÉGÉâÅ[Ç™î≠ê∂ǵNjÇ∑ÅB

Toolbox ÇåƒÇ—èoÇ≥ǻǢÇ≈Ç≠ÇæÇ≥Ç¢ÅBToolbox Ç…ÇÕÅAåªç›Ç≈LJëÂó Çà 68K ÉRÅ[ÉhÇ™écǡǃǮÇËÅAÇ≥ÇÁÇ…à´Ç¢Ç±ÇΔDžǪÇÃëÂïîï™Ç™ÉmÉìÉäÉGÉìÉgÉâÉìÉg(çƒì¸ïsâ¬)Ç≈Ç∑ÅBÇΩÇΔǶnjÅAdžÇÈÉ^ÉXÉNÇ™ NewPtr ÇåƒÇ—èoǵǃǢǃÅAï ÇÃÉ^ÉXÉNLJ NewPtr ÇåƒÇ—èoÇ∑DZÇΔÇåàíËǵÇΩèÍçáÅAóºï˚ÇÃÉ^ÉXÉNÇÕNjǡÇΩÇ≠ìØéûÇ…ìØàÍÇÃÉOÉçÅ[ÉoÉãÉqÅ[Évç\ë¢ëÃÇéÊÇËàµÇ§Ç±ÇΔÇ…Ç»ÇËÅAÇ‹Ç∏ämé¿Ç…DZÇÃç\ë¢ëÃÇîjâÛǵǃǵNjǢNjÇ∑ÅBMac OS 8 Ç≈ÇÕÅAÇ¢Ç≠ǬǩÇà Toolbox ÉãÅ[É`ÉìÇ™ MP É^ÉXÉNÇ©ÇÁåƒÇ—èoÇπÇÈÇÊǧDžǻÇËÇ‹Ç∑ÅBDZÇÍÇÁÇÃÉãÅ[É`ÉìÇÕ Mac OS 8 ÇÃÉCÉìÉ^ÉtÉFÅ[ÉXÉtÉ@ÉCÉãÇÃíÜÇà FOR_SYSTEM8_PREEMPTIVE ÉtÉâÉOÇ…ÇÊǡǃèåèâªÇ≥ÇÍÇ‹Ç∑ÅB

ñ¢ímÇÃÉRÅ[ÉhÇåƒÇ—èoÇ≥ǻǢÇ≈Ç≠ÇæÇ≥Ç¢ÅBÉTÅ[ÉhÉpÅ[ÉeÉBÇ™ÉRÅ[ÉãÉoÉbÉNÇéwíËÇ∑ÇÈÇΩÇflÇÃï˚ñ@ÇíÒãüÇ∑ÇÈèÍçáÇÕÅAÉ^ÉXÉNÇ©ÇÁǪÇÃä÷êîÇåƒÇ—èoÇ≥ǻǢÇÊǧDžǵǃÇ≠ÇæÇ≥Ç¢ÅBÉRÅ[ÉãÉoÉbÉNÇ™âΩÇé¿çsÇ∑ÇÈÇ©ÇÕÇÌÇ©ÇËÇ‹ÇπÇÒÅBDZÇÃÉãÅ[ÉãÇ…ÇÕê‚ëŒÇ…ǵÇΩǙǡǃÇ≠ÇæÇ≥Ç¢ÅBÉRÅ[ÉãÉoÉbÉNÇ™ÉäÉGÉìÉgÉâÉìÉgÇ≈džÇÈDZÇΔÇì¡Ç…óvãÅǵǻǢèÍçáÅAèÌDžǪǧÇ≈ǻǢâ¬î\ê´Ç™ë∂ç›Ç∑ÇÈDZÇΔÇ…Ç»ÇËÇ‹Ç∑ÅB

ÉOÉçÅ[ÉoÉãÇîÇØÇƒÇ≠ÇæÇ≥Ç¢ÅBnon-reentrancy ÇÃéÂÇ»å¥àˆÇÕÉOÉçÅ[ÉoÉãÇÃéÊÇËàµÇ¢Ç…džÇËÇ‹Ç∑ÅBÉOÉçÅ[ÉoÉãÅAÉOÉçÅ[ÉoÉãÉXÉeÅ[ÉgÅAdžÇÈÇ¢ÇÕÉOÉçÅ[ÉoÉãÇ…ÇÊǡǃÉ|ÉCÉìÉgÇ≥ÇÍÇÈÉoÉbÉtÉ@ÇéÊÇËàµÇ§É^ÉXÉNÇÕÅAìØä˙ÉeÉNÉjÉbÉNÇégǡǃÅAëºÇÃÉ^ÉXÉNÇ™ìØéûÇ…ìØÇ∂èàóùÇçsÇÌǻǢÇÊǧDžÇ∑ÇÈïKóvǙdžÇËÇ‹Ç∑ÅBì«Ç›çûÇ›êÍópÇÃÉOÉçÅ[ÉoÉãÇ»ÇÁà¿ëSÇ≈Ç∑ÅB

äÑÇËçûÇ›éûÇ… MP API ÉãÅ[É`ÉìÇåƒÇ—èoÇ≥ǻǢÇ≈Ç≠ÇæÇ≥Ç¢ÅBåµñßÇ…åæÇ§ÇΔÅAÉ}ÉãÉ`ÉvÉçÉZÉbÉVÉìÉO API ÉâÉCÉuÉâÉäÇÕÅAÉäÉGÉìÉgÉâÉìÉgÇ≈ÇÕdžÇËÇ‹ÇπÇÒÅBÉ}ÉãÉ`ÉvÉçÉZÉbÉVÉìÉOÉ^ÉXÉNÇ©ÇÁÇÕÅAǢǬÇ≈LJîCà”ÇÃÉ}ÉãÉ`ÉvÉçÉZÉbÉVÉìÉO API ÉãÅ[É`ÉìÇåƒÇ—èoÇ∑DZÇΔÇ™Ç≈Ç´Ç‹Ç∑Ç™ÅAíxâÑÉ^ÉXÉNÅAÉ^ÉCÉÄÉ}ÉlÅ[ÉWÉÉÉ^ÉXÉNÅAdžÇÈÇ¢ÇÕǪÇÃëºÇÃÉVÉXÉeÉÄäÑÇËçûÇ›ÉnÉìÉhÉâÇ©ÇÁDZÇÍÇÁÇÃÉãÅ[É`ÉìÇåƒÇ—èoǵǃÇÕÇ¢ÇØÇ‹ÇπÇÒÅBâÒîï˚ñ@ÇÕë∂ç›ÇµÇ‹Ç∑Ç™ÅAǪÇÍÇÁÇÕïsè\ï™Ç»ëŒèàï˚ñ@Ç≈džÇËÅAàÍî ìIÇ…ÇÕÇ®ä©ÇflÇ≈Ç´Ç‹ÇπÇÒÅBè⁄ç◊DžǬǢǃÇÕÅAApple DTS Ç‹ÇΩÇÕ DayStar Ç‹Ç≈Ç®ñ‚Ç¢çáÇÌÇπÇ≠ÇæÇ≥Ç¢ÅB

óvñÒ
DZÇà TECHNOTE Çì«Ç›èIÇÌÇÈÇΔÅAÉ}ÉãÉ`ÉvÉçÉZÉbÉVÉìÉOëŒâûÉAÉvÉäÉPÅ[ÉVÉáÉìÇÃäJî≠Ç…î∫ǧäÓñ{ìIÇ»ÉXÉeÉbÉvÇóùâÇ≈Ç´ÇÈÇÕÇ∏Ç≈Ç∑ÅBóvÇ∑ÇÈÇ…ÅAÉ}ÉãÉ`ÉvÉçÉZÉbÉVÉìÉO API ÉâÉCÉuÉâÉäÇ™égópâ¬î\Ç≈džÇÈǩǫǧǩÇämîFÇ∑ÇÈïKóvǙdžÇËÅAÉvÉçÉZÉbÉTÇÃêîÇÉJÉEÉìÉgÇ∑ÇÈïKóvǙdžÇËÅAï°êîÇÃÉ^ÉXÉNÇìØä˙Ç≥ÇπÇÈÇΩÇflÇÃï˚ñ@ÇçÏê¨Ç∑ÇÈïKóvǙdžÇËÅAÇ≥ÇÁÇ…Ç∑Ç◊ǃÇÃÉvÉçÉZÉbÉTÇ™èÌÇ…ÉrÉWÅ[Ç≈džÇËë±ÇØÇÈÇÊǧDžè\ï™Ç»êîÇÃÉ^ÉXÉNÇçÏê¨Ç∑ÇÈïKóvǙdžÇËÇ‹Ç∑ÅBÉ^ÉXÉNÇ™çÏê¨Ç≥ÇÍÇÈÇΔÅAÉ^ÉXÉNÇΔÇÃä‘Ç≈ÉÜÉjÅ[ÉNÇ»èÓïÒÇÇ‚ÇËéÊÇËÇ≈Ç´ÅAèàóùÇé¿çsÇ∑ÇÈïKóvǙdžÇÈÇΔÇ´ÅAÉ^ÉXÉNÇΔÉAÉvÉäÉPÅ[ÉVÉáÉìÇΔÇÃä‘Ç≈í≤êÆÇçsǧDZÇΔÇ™â¬î\Ç…Ç»ÇËÇ‹Ç∑ÅBÉAÉvÉäÉPÅ[ÉVÉáÉìÇèIóπÇ∑ÇÈÇΔÇ´ÅAìØä˙ÉIÉuÉWÉFÉNÉgÇÕçÌèúÇ≥ÇÍÅAÉ^ÉXÉNLJèIóπÇµÇ»ÇØÇÍnjǻÇËÇ‹ÇπÇÒÅB

Ç‹ÇΩÅAÉ^ÉXÉNÇ™é¿çsÇ≈Ç´ÇÈèàóùÇÃÉ^ÉCÉvÇ…èKènǵÅAìØéûÇ…É^ÉXÉNÇ™é¿çsÇ≈ǴǻǢLJÇÃLJê≥ǵÇ≠îFéØÇ≈Ç´ÇΩÇÕÇ∏Ç≈Ç∑ÅB

éQçlï∂å£
  • Multiprocessing SDK

â¸í˘óöó
ÉIÉäÉWÉiÉãî≈ÇÕÅA1996 îN 7 åéÇ…èëÇ©ÇÍNjǵÇΩÅB